import CryptoJS from 'crypto-js'
import uploadConfig from '@/config/upload'
import CityLinkageJson from '@/components/ma-cityLinkage/lib/city.json'

const typeColor = (type = 'default') => {
	let color = ''
	switch (type) {
		case 'default':
			color = '#35495E'
			break
		case 'primary':
			color = '#3488ff'
			break
		case 'success':
			color = '#43B883'
			break
		case 'warning':
			color = '#e6a23c'
			break
		case 'danger':
			color = '#f56c6c'
			break
		default:
			break
	}
	return color
}

const tool = {}

/**
 * LocalStorage
 */
tool.local = {
	set(table, settings) {
		let _set = JSON.stringify(settings)
		return localStorage.setItem(table, _set)
	},
	get(table) {
		let data = localStorage.getItem(table)
		try {
			data = JSON.parse(data)
		} catch (err) {
			return null
		}
		return data
	},
	remove(table) {
		return localStorage.removeItem(table)
	},
	clear() {
		return localStorage.clear()
	},
}

/**
 * SessionStorage
 */
tool.session = {
	set(table, settings) {
		let _set = JSON.stringify(settings)
		return sessionStorage.setItem(table, _set)
	},
	get(table) {
		let data = sessionStorage.getItem(table)
		try {
			data = JSON.parse(data)
		} catch (err) {
			return null
		}
		return data
	},
	remove(table) {
		return sessionStorage.removeItem(table)
	},
	clear() {
		return sessionStorage.clear()
	},
}

/**
 * CookieStorage
 */
tool.cookie = {
	set(name, value, config = {}) {
		var cfg = {
			expires: null,
			path: null,
			domain: null,
			secure: false,
			httpOnly: false,
			...config,
		}
		var cookieStr = `${name}=${escape(value)}`
		if (cfg.expires) {
			var exp = new Date()
			exp.setTime(exp.getTime() + parseInt(cfg.expires) * 1000)
			cookieStr += `;expires=${exp.toGMTString()}`
		}
		if (cfg.path) {
			cookieStr += `;path=${cfg.path}`
		}
		if (cfg.domain) {
			cookieStr += `;domain=${cfg.domain}`
		}
		document.cookie = cookieStr
	},
	get(name) {
		var arr = document.cookie.match(new RegExp('(^| )' + name + '=([^;]*)(;|$)'))
		if (arr != null) {
			return unescape(arr[2])
		} else {
			return null
		}
	},
	remove(name) {
		var exp = new Date()
		exp.setTime(exp.getTime() - 1)
		document.cookie = `${name}=;expires=${exp.toGMTString()}`
	},
}

/* Fullscreen */
tool.screen = (element) => {
	let isFull = !!(document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement || document.fullscreenElement)
	if (isFull) {
		if (document.exitFullscreen) {
			document.exitFullscreen()
		} else if (document.msExitFullscreen) {
			document.msExitFullscreen()
		} else if (document.mozCancelFullScreen) {
			document.mozCancelFullScreen()
		} else if (document.webkitExitFullscreen) {
			document.webkitExitFullscreen()
		}
	} else {
		if (element.requestFullscreen) {
			element.requestFullscreen()
		} else if (element.msRequestFullscreen) {
			element.msRequestFullscreen()
		} else if (element.mozRequestFullScreen) {
			element.mozRequestFullScreen()
		} else if (element.webkitRequestFullscreen) {
			element.webkitRequestFullscreen()
		}
	}
}

// 城市代码翻译成名称
tool.cityToCode = function (province, city = undefined, area = undefined, split = ' / ') {
	try {
		let provinceData = CityLinkageJson.filter((item) => province == item.code)[0]
		if (!city) {
			return provinceData.name
		}
		let cityData = provinceData.children.filter((item) => city == item.code)[0]

		if (!area) {
			return [provinceData.name, cityData.name].join(split)
		}
		let areaData = cityData.children.filter((item) => area == item.code)[0]

		return [provinceData.name, cityData.name, areaData.name].join(split)
	} catch (e) {
		return ''
	}
}

/* 复制对象 */
tool.objCopy = (obj) => {
	if (obj === undefined) {
		return undefined
	}
	return JSON.parse(JSON.stringify(obj))
}

tool.generateId = function () {
	return Math.floor(Math.random() * 100000 + Math.random() * 20000 + Math.random() * 5000)
}

tool.viewImage = function (path, defaultStorage = 'LOCAL') {
	if (path.indexOf('http') !== -1) {
		return path
	}
	let mode = tool.local.get('site_storage_mode') ? tool.local.get('site_storage_mode').toUpperCase() : defaultStorage
	return uploadConfig.storage[mode] + path
}

tool.showFile = function (hash, defaultStorage = 'LOCAL') {
	if (!hash) {
		return ''
	}
	if (hash.indexOf('.') !== -1) {
		return tool.viewImage(hash, defaultStorage)
	}
	let mode = tool.local.get('site_storage_mode') ? tool.local.get('site_storage_mode').toUpperCase() : defaultStorage
	return uploadConfig.storage[mode] + '/system/showFile/' + hash
}

/* 日期格式化 */
tool.dateFormat = (date, fmt = 'yyyy-MM-dd hh:mm:ss', isDefault = '-') => {
	if (date.toString().length == 10) {
		date = date * 1000
	}
	date = new Date(date)

	if (date.valueOf() < 1) {
		return isDefault
	}
	let o = {
		'M+': date.getMonth() + 1, //月份
		'd+': date.getDate(), //日
		'h+': date.getHours(), //小时
		'm+': date.getMinutes(), //分
		's+': date.getSeconds(), //秒
		'q+': Math.floor((date.getMonth() + 3) / 3), //季度
		S: date.getMilliseconds(), //毫秒
	}
	if (/(y+)/.test(fmt)) {
		fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
	}
	for (let k in o) {
		if (new RegExp('(' + k + ')').test(fmt)) {
			fmt = fmt.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length))
		}
	}
	return fmt
}

/* 千分符 */
tool.groupSeparator = (num) => {
	num = num + ''
	if (!num.includes('.')) {
		num += '.'
	}
	return num
		.replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) {
			return $1 + ','
		})
		.replace(/\.$/, '')
}

tool.md5 = (str) => {
	return CryptoJS.MD5(str).toString()
}

tool.base64 = {
	encode(data) {
		return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data))
	},
	decode(cipher) {
		return CryptoJS.enc.Base64.parse(cipher).toString(CryptoJS.enc.Utf8)
	},
}

tool.aes = {
	encode(data, secretKey) {
		const result = CryptoJS.AES.encrypt(data, CryptoJS.enc.Utf8.parse(secretKey), {
			mode: CryptoJS.mode.ECB,
			padding: CryptoJS.pad.Pkcs7,
		})
		return result.toString()
	},
	decode(cipher, secretKey) {
		const result = CryptoJS.AES.decrypt(cipher, CryptoJS.enc.Utf8.parse(secretKey), {
			mode: CryptoJS.mode.ECB,
			padding: CryptoJS.pad.Pkcs7,
		})
		return CryptoJS.enc.Utf8.stringify(result)
	},
}

tool.capsule = (title, info, type = 'primary') => {
	console.log(
		`%c ${title} %c ${info} %c`,
		'background:#35495E; padding: 1px; border-radius: 3px 0 0 3px; color: #fff;',
		`background:${typeColor(type)}; padding: 1px; border-radius: 0 3px 3px 0;  color: #fff;`,
		'background:transparent'
	)
}

tool.formatSize = (size) => {
	if (typeof size == 'undefined') {
		return '0'
	}
	let units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']
	let index = 0
	for (let i = 0; size >= 1024 && i < 5; i++) {
		size /= 1024
		index = i
	}
	return Math.round(size, 2) + units[index]
}

tool.download = (res, downName = '') => {
	const aLink = document.createElement('a')
	let fileName = downName
	let blob = res //第三方请求返回blob对象

	//通过后端接口返回
	if (res.headers && res.data) {
		blob = new Blob([res.data], { type: res.headers['content-type'].replace(';charset=utf8', '') })
		if (!downName) {
			const contentDisposition = decodeURI(res.headers['content-disposition'])
			const result = contentDisposition.match(/filename=\"(.+)/gi)
			fileName = result[0].replace(/filename=\"/gi, '')
			fileName = fileName.replace('"', '')
		}
	}

	aLink.href = URL.createObjectURL(blob)
	// 设置下载文件名称
	aLink.setAttribute('download', fileName)
	document.body.appendChild(aLink)
	aLink.click()
	document.body.removeChild(aLink)
	URL.revokeObjectURL(aLink.href)
}

/**
 * 对象转url参数
 * @param {*} data
 * @param {*} isPrefix
 */
tool.httpBuild = (data, isPrefix = false) => {
	let prefix = isPrefix ? '?' : ''
	let _result = []
	for (let key in data) {
		let value = data[key]
		// 去掉为空的参数
		if (['', undefined, null].includes(value)) {
			continue
		}
		if (value.constructor === Array) {
			value.forEach((_value) => {
				_result.push(encodeURIComponent(key) + '[]=' + encodeURIComponent(_value))
			})
		} else {
			_result.push(encodeURIComponent(key) + '=' + encodeURIComponent(value))
		}
	}

	return _result.length ? prefix + _result.join('&') : ''
}

tool.getRequestParams = (url) => {
	const theRequest = new Object()
	if (url.indexOf('?') != -1) {
		const params = url.split('?')[1].split('&')
		for (let i = 0; i < params.length; i++) {
			const param = params[i].split('=')
			theRequest[param[0]] = decodeURIComponent(param[1])
		}
	}
	return theRequest
}

tool.attachUrl = (path, defaultStorage = 'LOCAL') => {
	return path
}

/**
 * 获取token
 */
tool.getToken = () => {
	return tool.local.get('token')
}
/**
 * 转Unix时间戳
 */

tool.toUnixTime = (date) => {
	return Math.floor(new Date(date).getTime() / 1000)
}

tool.arrSum = (arr) => {
	let sum = 0
	arr.map((item) => (sum += item))
	return sum
}

export default tool
